/* -*-jde-*- */
package app.administrador;

import app.alumnoe.AlumnoE;
import app.conexion.Conexion;
import app.conexion.ConexionException;
import app.empresa.Empresa;
import app.empresa.Vacante;
import app.htmlGenerator.HTMLCVGenerator;
import app.htmlGenerator.HTMLEmpresaGenerator;
import app.htmlGenerator.HTMLVacanteGenerator;
import app.mail.Mail;
import app.util.appException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import ui.empresaInterfaz.VacanteBean;

/**
 * Efectua las decisiones de administración del sistema.
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Enero 2012
 * @version 0.1
 */
public class Administrador {

    /**
     * Enviamos correo a la empresa diciendole porque se rechaza su solicitud.
     *
     * @param nIdEmpresa
     * @param motivo
     */
    public static void rechazoEmpresa(final int nIdEmpresa, final String motivo) throws appException {

        // Mandamos correo al responsable de la vacante sin detenernos a esperar el resultado

        Empresa v = new Empresa(nIdEmpresa);

        final String nombre = v.getsNombre();
        final String mail = v.getsCorreo();

        v.delete();

        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        try {

                            Mail.sendRechazoEmpresa(nombre, motivo, mail);

                        } catch (appException ex) {
                            Logger.getLogger(Administrador.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }).start();


        //Conexion.close();

    }

    /**
     * Enviamos correo a la empresa diciendole porque se rechaza su solicitud.
     *
     * @param nIdEmpresa
     * @param motivo
     */
    public static void rechazoEmpresaActiva(final int nIdEmpresa) throws appException {

        // Mandamos correo al responsable de la vacante sin detenernos a esperar el resultado

        Empresa v = new Empresa(nIdEmpresa);

        final String nombre = v.getsNombre();
        final String mail = v.getsCorreo();

        v.delete();

        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        try {

                            Mail.sendRechazoEmpresaActiva(nombre, mail);

                        } catch (appException ex) {
                            Logger.getLogger(Administrador.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }).start();


        //Conexion.close();

    }

    /**
     * Enviamos correo a la empresa diciendole porque se rechaza su solicitud.
     *
     * @param nIdEmpresa
     * @param motivo
     */
    public static void rechazoAlumno(final int nIdAlumno) throws appException {

        // Mandamos correo al responsable de la vacante sin detenernos a esperar el resultado

        AlumnoE v = new AlumnoE(nIdAlumno);

        final String nombre = v.getsNombre();
        final String cuenta = v.getsNumeroCuenta();
        final String mail = v.getCorreoPrimarioAlumno();

        v.delete();

        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        try {

                            Mail.sendRechazoAlumno(nombre, cuenta, mail);

                        } catch (appException ex) {
                            Logger.getLogger(Administrador.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }).start();


        //Conexion.close();

    }

    /**
     * Enviamos correo a la empresa diciendole porque se rechaza su solicitud.
     *
     * @param nIdEmpresa
     * @param motivo
     */
    public static void borrarAdministrador(final String nombreUsuario, final String Contrasenia, final String contraseniaSistema) throws appException {
        try {
            Conexion con = new Conexion();

            String query = "select deleteAdministrador('" + nombreUsuario + "','" + Contrasenia + "','" + contraseniaSistema + "');";

            con.exec(query);

            con.close();
        } catch (ConexionException ex) {
            Logger.getLogger(Administrador.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    /**
     * Enviamos correo al responsable de lña vacante diciendole porque se
     * rechaza su solicitud.
     *
     * @param nIdEmpresa
     * @param motivo
     */
    public static void rechazoVacante(final int nIdVacante, final String motivo) throws appException {

        Vacante v = new Vacante(nIdVacante);

        final String nombreContacto = v.getsNombreCompletoContacto();
        final String titulo = v.getsTituloVacante();
        final String correo = v.getsCorreo();

        new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        try {

                            Mail.sendRechazoVacante(nombreContacto, titulo, motivo, correo);

                        } catch (appException ex) {
                            Logger.getLogger(Administrador.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }).start();


        v.delete();
        //Conexion.close();

    }

    /**
     * Acepta una vacante inactiva de modo que esta se pueda mostrar a los
     * alumnos. Manda un correo electrónico al Responsable de Vacante en la
     * empresa avisando esta situación.
     *
     * @param nIdVacante
     * @throws appException
     */
    public static void aceptaVacante(int nIdVacante) throws appException {
        try {

            Conexion con = new Conexion();

            String query = "select setActivadaVacante(" + nIdVacante + ");";

            con.exec(query);

            // Mandamos correo al responsable de la vacante sin detenernos a esperar el resultado
            final int id = nIdVacante;
            new Thread(
                    new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Vacante v = new Vacante(id);

                                Mail.sendAceptaVacante(v.getsTituloVacante(), v.getsNombreCompletoContacto(), v.getsCorreo());
                            } catch (appException ex) {
                                Logger.getLogger(Administrador.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }).start();


            con.close();
            //Conexion.close();
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo activar la Vacante.");
        }
    }

    /**
     * Regresa la lista de Vacantes inactivas ya con la página html a mostrar al
     * admin.
     *
     * @return
     * @throws appException
     */
    public static LinkedList<Vacante> getVacantesInactivas() throws appException {
        try {

            Conexion con = new Conexion();
            LinkedList<Vacante> vacantes = new LinkedList<Vacante>();

            String query = "select nIdvacante from vacantes where bactivado = FALSE;";

            ResultSet r = con.exec(query);

            while (r.next()) {
                int llave = r.getInt("nidvacante");
                Vacante e = new Vacante(llave);
                HTMLVacanteGenerator htmle = new HTMLVacanteGenerator(e);
                String html = htmle.generarVacante();
                e.setHtmlVacante(html);

                vacantes.add(e);
            }

            con.close();
            return vacantes;

        } catch (SQLException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar las Vacantes inactivas.");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar las Vacantes inactivas.");
        }
    }

    /**
     * Regresa la lista de Vacantes inactivas ya con la página html a mostrar al
     * admin.
     *
     * @return
     * @throws appException
     */
    public static LinkedList<Vacante> getVacantesActivas() throws appException {
        try {

            Conexion con = new Conexion();
            LinkedList<Vacante> vacantes = new LinkedList<Vacante>();

            String query = "select nIdvacante from vacantes where bactivado = TRUE;";

            ResultSet r = con.exec(query);

            while (r.next()) {
                int llave = r.getInt("nidvacante");
                Vacante e = new Vacante(llave);
                HTMLVacanteGenerator htmle = new HTMLVacanteGenerator(e);
                String html = htmle.generarVacante();
                e.setHtmlVacante(html);

                vacantes.add(e);
            }

            con.close();
            return vacantes;

        } catch (SQLException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar las Vacantes inactivas.");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar las Vacantes inactivas.");
        }
    }

    /**
     * Regresa la lista de empresas inactivas ya con la página html a mostrar al
     * admin.
     *
     * @return
     * @throws appException
     */
    public static LinkedList<Empresa> getEmpresasActivas() throws appException {
        try {

            Conexion con = new Conexion();
            LinkedList<Empresa> empresas = new LinkedList<Empresa>();

            String query = "select nidusuario from usuarios where ctipousuario LIKE 'E' and bactivado = TRUE;";

            ResultSet r = con.exec(query);

            while (r.next()) {
                int llave = r.getInt("nidusuario");
                Empresa e = new Empresa(llave);
                HTMLEmpresaGenerator htmle = new HTMLEmpresaGenerator(e);
                String html = htmle.generarEmpresa();
                e.setHtml(html);

                empresas.add(e);
            }

            con.close();
            return empresas;

        } catch (SQLException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar las Empresas inactivas.");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar las Empresas inactivas.");
        }
    }

    /**
     * Regresa la lista de empresas inactivas ya con la página html a mostrar al
     * admin.
     *
     * @return
     * @throws appException
     */
    public static LinkedList<Empresa> getEmpresasInactivas() throws appException {
        try {

            Conexion con = new Conexion();
            LinkedList<Empresa> empresas = new LinkedList<Empresa>();

            String query = "select nidusuario from usuarios where ctipousuario LIKE 'E' and bactivado = FALSE;";

            ResultSet r = con.exec(query);

            while (r.next()) {
                int llave = r.getInt("nidusuario");
                Empresa e = new Empresa(llave);
                HTMLEmpresaGenerator htmle = new HTMLEmpresaGenerator(e);
                String html = htmle.generarEmpresa();
                e.setHtml(html);

                empresas.add(e);
            }

            con.close();

            return empresas;

        } catch (SQLException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar las Empresas inactivas.");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar las Empresas inactivas.");
        }
    }

    /**
     * Activa un usuario empresa. de modo que esta quede registrada para poder
     * entrar al sistema Manda un correo electrónico a la empresa avisando esta
     * situación.
     *
     * @param nIdEmpresa
     * @throws appException
     */
    public static void aceptaEmpresa(int nIdEmpresa) throws appException {
        try {

            Conexion con = new Conexion();

            String query = "select setActivado(" + nIdEmpresa + ");";

            con.exec(query);

            // Mandamos correo a la empresa
            final int id = nIdEmpresa;
            new Thread(
                    new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Empresa v = new Empresa(id);

                                Mail.sendAceptaEmpresa(v.getsNombre(), v.getsCorreo());

                            } catch (appException ex) {
                                Logger.getLogger(Administrador.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }).start();

            con.close();

        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo activar al usuario.");
        }
    }

    /**
     * borra todas y cada una de las vacantes que ya llevan el el sistema
     * <code> numMeses </code> de número de meses.
     *
     * @param numMeses
     * @throws appException
     */
    public static void borraVacantesPorMes(int numMeses) throws appException {

        try {

            Conexion con = new Conexion();
            LinkedList<Integer> aBorrar = new LinkedList<Integer>();
            String query = "select nidvacante from vacantes where datediff('month', dfechapublicacion, now()::date ) >= " + numMeses + ";";

            ResultSet r = con.exec(query);

            while (r.next()) {
                int llave = r.getInt("nidvacante");
                aBorrar.add(llave);
            }

            for (int llave : aBorrar) {

                String deleteQuery = "select deleteVacante( " + llave + " );";
                con.exec(deleteQuery);
            }

            for (int llave : aBorrar) {

                String deleteQuery = "select deleteTodosPostulados( " + llave + " );";
                con.exec(deleteQuery);
            }

            con.close();

        } catch (SQLException ex) {
            System.err.println(ex);
            Logger.getLogger(Administrador.class.getName()).log(Level.SEVERE, null, ex);
            throw new appException("No se pudieron borrar las vacantes con antiguedad");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron borrar las vacantes con antiguedad");
        }
    }

    /**
     * Regresa la lista de empresas inactivas ya con la página html a mostrar al
     * admin.
     *
     * @return
     * @throws appException
     */
    public static LinkedList<AlumnoE> getAlumnos() throws appException {
        try {

            Conexion con = new Conexion();
            LinkedList<AlumnoE> alumnos = new LinkedList<AlumnoE>();

            String query = "select nidusuario from usuarios where ctipousuario LIKE 'A';";

            ResultSet r = con.exec(query);

            while (r.next()) {
                int llave = r.getInt("nidusuario");
                AlumnoE e = new AlumnoE(llave);
                HTMLCVGenerator htmle = new HTMLCVGenerator(e);
                String html = htmle.generarCV();
                e.setHtmls(html);

                alumnos.add(e);
            }

            con.close();
            return alumnos;

        } catch (SQLException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar los Alumnos inactivas.");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudieron recuperar los Alumnos inactivas.");
        }
    }
}
